﻿/*
 * 作者：新生命开发团队（http://www.newlifex.com/）
 * 
 * 版权：版权所有 (C) 新生命开发团队 2002-2014
 * 
 * 修改：海洋饼干（cuteant@outlook.com）
*/

using System;

namespace CuteAnt.Serialization
{
	/// <summary>写入器接口</summary>
	/// <remarks>
	/// 序列化框架的核心思想：基本类型直接写入，自定义类型反射得到成员，逐层递归写入！详见<see cref="IReaderWriter" />
	///
	/// 序列化对象时只能调用<see cref="WriteObject(Object)" />方法，其它所有方法（包括所有Write重载）仅用于内部写入或者自定义序列化时使用。
	/// </remarks>
	public interface IWriter : IReaderWriter
	{
		#region 方法

		/// <summary>主要入口方法。把对象写入数据流</summary>
		/// <param name="value">对象</param>
		/// <returns>是否写入成功</returns>
		Boolean WriteObject(Object value);

		/// <summary>主要入口方法。写入对象。具体读写器可以重载该方法以修改写入对象前后的行为。</summary>
		/// <param name="value">对象</param>
		/// <param name="type">要写入的对象类型</param>
		/// <param name="callback">处理成员的方法</param>
		/// <returns>是否写入成功</returns>
		Boolean WriteObject(Object value, Type type, WriteObjectCallback callback);

		/// <summary>写入对象成员</summary>
		/// <param name="name">成员名字</param>
		/// <param name="value">要写入的对象</param>
		/// <param name="type">要写入的成员类型</param>
		/// <param name="index">成员索引</param>
		/// <param name="callback">处理成员的方法</param>
		/// <returns>是否写入成功</returns>
		Boolean WriteMember(String name, Object value, Type type, Int32 index, WriteObjectCallback callback);

		/// <summary>刷新缓存中的数据</summary>
		void Flush();

		#endregion

		#region 事件

		/// <summary>写对象前触发。</summary>
		event EventHandler<WriteObjectEventArgs> OnObjectWriting;

		/// <summary>写对象后触发。</summary>
		event EventHandler<WriteObjectEventArgs> OnObjectWrited;

		/// <summary>写成员前触发。</summary>
		event EventHandler<WriteMemberEventArgs> OnMemberWriting;

		/// <summary>写成员后触发。</summary>
		event EventHandler<WriteMemberEventArgs> OnMemberWrited;

		#endregion
	}

	/// <summary>数据写入方法</summary>
	/// <param name="writer">写入器</param>
	/// <param name="value">要写入的对象</param>
	/// <param name="type">要写入的对象类型</param>
	/// <param name="callback">处理成员的方法</param>
	/// <returns>是否写入成功</returns>
	public delegate Boolean WriteObjectCallback(IWriter writer, Object value, Type type, WriteObjectCallback callback);
}